package com.meaningful.multithreading_and_concurrency.cpu_cache_effect;

/**
 * 测试volatile对复合操作的可见性 即 复合操作的原子性
 */
public class TestVolatileMultiOper {

    volatile int i;

    public void addI() {
        // i++ 是非原子操作，实际分三步执行：
        // 1. 从主内存读取 i 到线程工作内存（如寄存器或 CPU 缓存）
        // 2. 在本地进行 i + 1 运算
        // 3. 将结果写回主内存

        // volatile 虽然能保证可见性（步骤 1 和 3 同步主内存），也能防止指令重排序，
        // 但无法保证这三个步骤整体的原子性 —— 可能多个线程读取到同一个旧值导致丢失更新。
        i++;
    }

    public static void main(String[] args) throws InterruptedException {
        final TestVolatileMultiOper test = new TestVolatileMultiOper();

        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                try {
                    // 追加后续代码 发生并发问题的概率
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                test.addI();
            }).start();
        }

        Thread.sleep(10000);
        System.out.println(test.i);
    }

}
